package liming.tool.handle.net.udp2.base;

import liming.tool.handle.net.udp2.bean.UdpHandleObject2;
import liming.tool.handle.net.udp2.bean.UdpNetObject;
import liming.tool.handle.net.udp2.socket.UdpReceiveMap;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.List;

public interface UdpBaseMethod {
    /**
     * 在将packet处理为netObject之前对packet进行处理
     * 返回值true为继续执行后面逻辑，false不执行后续逻辑
     */
    default boolean handleFrontPacketData(DatagramPacket datagramPacket, DatagramSocket datagramSocket) throws Exception {
        return true;
    }

    /**
     * 在将packet处理为netObject之后对packet进行处理
     * 返回值true为继续执行后面逻辑，false不执行后续逻辑
     */
    default boolean handleAfterPacketData(DatagramPacket datagramPacket, DatagramSocket datagramSocket, UdpNetObject udpNetObject) throws Exception {
        return true;
    }

    /**
     * 不完整数据处理方法
     *
     * @return 是否放入到接收数据缓冲池中
     */
    UdpNetObject handleDataReceiveListenPool(UdpNetObject udpNetObject, DatagramSocket datagramSocket) throws Exception;

    /**
     * 实现数据提交上层，主要用于当收到完整的UdpReceiveMap后将数据视情况提交到上层的doWork方法。
     * 业务处理模块，由Server或Client自主完成,
     * UdpHandleObject3中含UdpReceiveMap和DatagramSocket
     */
    boolean handleDataSubmissionPool(UdpReceiveMap udpReceiveMap, DatagramSocket datagramSocket) throws Exception;

    /**
     * 实现数据接收缓存逻辑之一 ———— 超时逻辑。
     * 当缓存的数据超过规定时间后，就会调用此处方法
     */
    void handleReceivePoolOnTimeout(String key, UdpHandleObject2 value);

    /**
     * 实现数据接收缓存逻辑之一 ———— 超限逻辑。
     * 当缓存的数据超过规定时间一定比例后（0~1），就会调用此处方法
     */
    void handleReceivePoolOnRestrict(String key, UdpHandleObject2 value);

    /**
     * 实现数据重新发送缓存逻辑。
     * 当发送的数据超过规定时间后，就会调用此处方法
     */
    void handleSendTimePool(DatagramSocket datagramSocket, InetAddress inetAddress, int port, String key, List<UdpNetObject> list);
}
